/*     */ package com.zimbra.cs.doc;
/*     */ 
/*     */ import com.zimbra.common.util.ByteUtil;
/*     */ import java.io.FileInputStream;
/*     */ import java.io.IOException;
/*     */ import java.io.InputStream;
/*     */ import java.io.PrintStream;
/*     */ import java.util.ArrayList;
/*     */ import java.util.Collection;
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ 
/*     */ public class Diff
/*     */ {
/*     */   public static final long MAX_LENGTH = 1048576L;
/*     */   
/*     */   public static enum Type
/*     */   {
/* 129 */     common,  first,  second;
/*     */     
/*     */     private Type() {} }
/*     */   
/*     */   public static class Chunk { public Diff.Type disposition;
/*     */     
/* 135 */     public Chunk(String c, Diff.Type disp) { this.content = new ArrayList();
/* 136 */       this.content.add(c);this.disposition = disp;
/*     */     }
/*     */     
/*     */     public ArrayList<String> content; }
/*     */   
/* 141 */   private static void addString(ArrayList<Chunk> chunks, String str, Type disp) { if (chunks.size() == 0) {
/* 142 */       chunks.add(new Chunk(str, disp));
/* 143 */       return;
/*     */     }
/* 145 */     Chunk c = (Chunk)chunks.get(chunks.size() - 1);
/* 146 */     if (c.disposition == disp) {
/* 147 */       c.content.add(str);
/*     */     } else
/* 149 */       chunks.add(new Chunk(str, disp));
/*     */   }
/*     */   
/*     */   private static String[] readInputStream(InputStream in) throws IOException {
/* 153 */     byte[] buf = ByteUtil.getContent(in, -1);
/* 154 */     return new String(buf, "UTF-8").split("\\n");
/*     */   }
/*     */   
/*     */   public static Collection<Chunk> getResult(InputStream i1, InputStream i2) throws IOException {
/* 158 */     String[] x = readInputStream(i1);
/* 159 */     String[] y = readInputStream(i2);
/*     */     
/* 161 */     ArrayList<Chunk> result = new ArrayList();
/*     */     
/*     */ 
/* 164 */     int M = x.length;
/* 165 */     int N = y.length;
/*     */     
/*     */ 
/* 168 */     int[][] opt = new int[M + 1][N + 1];
/*     */     
/*     */ 
/* 171 */     for (int i = M - 1; i >= 0; i--) {
/* 172 */       for (int j = N - 1; j >= 0; j--) {
/* 173 */         if (x[i].equals(y[j])) {
/* 174 */           opt[i][j] = (opt[(i + 1)][(j + 1)] + 1);
/*     */         } else {
/* 176 */           opt[i][j] = Math.max(opt[(i + 1)][j], opt[i][(j + 1)]);
/*     */         }
/*     */       }
/*     */     }
/*     */     
/* 181 */     int i = 0;int j = 0;
/* 182 */     while ((i < M) && (j < N)) {
/* 183 */       if (x[i].equals(y[j])) {
/* 184 */         addString(result, x[i], Type.common);
/* 185 */         i++;j++;
/* 186 */       } else if (opt[(i + 1)][j] >= opt[i][(j + 1)]) {
/* 187 */         addString(result, x[(i++)], Type.first);
/*     */       } else {
/* 189 */         addString(result, y[(j++)], Type.second);
/*     */       }
/*     */     }
/*     */     
/*     */ 
/* 194 */     while ((i < M) || (j < N)) {
/* 195 */       if (i == M) {
/* 196 */         addString(result, y[(j++)], Type.second);
/* 197 */       } else if (j == N) {
/* 198 */         addString(result, x[(i++)], Type.first);
/*     */       }
/*     */     }
/*     */     
/* 202 */     return result;
/*     */   }
/*     */   
/*     */   public static void main(String[] args) throws Exception {
/* 206 */     FileInputStream f1 = new FileInputStream(args[0]);
/* 207 */     FileInputStream f2 = new FileInputStream(args[1]);
/* 208 */     Collection<Chunk> chunks = getResult(f1, f2);
/* 209 */     for (Chunk c : chunks) {
/* 210 */       switch (c.disposition) {
/*     */       case common: 
/*     */         break;
/*     */       case first: 
/* 214 */         for (String str : c.content)
/* 215 */           System.out.println("< " + str);
/* 216 */         break;
/*     */       case second: 
/* 218 */         for (String str : c.content) {
/* 219 */           System.out.println("> " + str);
/*     */         }
/*     */       }
/*     */     }
/*     */   }
/*     */ }


/* Location:              /home/mint/zimbrastore.jar!/com/zimbra/cs/doc/Diff.class
 * Java compiler version: 7 (51.0)
 * JD-Core Version:       0.7.1
 */